#include "client.h"


void *receive_read(void *val)
{
    TCP_data info;
  
    int fd = *(int *)val;
    while (1)
    {

        memset(&info, 0, sizeof(info));

         if (read(fd, &info, sizeof(info)) <= 0)
        {
            continue;
        }
        if (info.SYN == 3)
        {
            printf("%s:%s \n", info.star_name,info.data);
            if ( 0== strcmp(info.data , "退出" ))
            {
                return NULL;
            }
            
        }
        
       
    }
}

void main_menu(int UDP_fd , struct sockaddr_in serveraddr , user_t userinfo)
{
    /*
    建立tcp连接
    */
    int TCP_fd =  socket(AF_INET, SOCK_STREAM, 0);
    if ( -1 == TCP_fd )
    {
        ERRLOG("TCP_fd socket error");
    }
    struct sockaddr_in TCP_server_addr;
    memset(&TCP_server_addr , 0 , sizeof(TCP_server_addr));
    TCP_server_addr.sin_family = AF_INET;
    TCP_server_addr.sin_port = htons(8080);  // 端口号可以随意指定
    TCP_server_addr.sin_addr.s_addr = inet_addr("192.168.10.234");
    socklen_t sock_len = sizeof(TCP_server_addr);
    connect(TCP_fd , (struct sockaddr * ) & TCP_server_addr , sock_len );
    ERRLOG("连接成功");

    

    const wchar_t *menu_items[] = {L"好友列表", L"群聊列表", L"个人中心", L"动态发布", L"文件下载",L"退出"}; 

    const wchar_t *title = L"你孤独吗？这里有一群热情、团结的朋友等着你"; 
    int num_items = sizeof(menu_items) / sizeof(menu_items[0]);  
    int title_size=sizeof(title);
 
    int res;
    while (1)
    {
        res= Login_menu_1(0,menu_items,num_items,title,title_size);
        switch (res)
        {
        case 0://好友列表
            printf("功能1\n");

            friend_menu(   userinfo  , TCP_fd);
            
            sleep(3);
            break;
        case 1://群聊列表
            printf("功能2\n");
            group_chat_menu( userinfo , UDP_fd , serveraddr );

            sleep(3);
            break;
        case 2://个人中心
            printf("功能3\n");
        
            personal_center(userinfo);


            sleep(3);
            break;
        case 3://动态发布
            printf("功能4\n");
            dynamic_issue();

            sleep(3);
            break;
        case 4://文件下载
            download_file(UDP_fd, serveraddr);

            break;
        case 5: // 退出
            download_file(UDP_fd, serveraddr);

            exit(-1);
        default:
            break;
        }
    }
}



void friend_list(user_t userinfo  , int TCP_fd)
{
    pthread_t tid;
    TCP_data info;

    /*   请求获得好友列表   */
    info.SYN=2;
    strcpy(info.star_name ,userinfo.name);
    strcpy(info.dest_name, "好友列表");
    strcpy(info.data, "无");
    send(TCP_fd, &info, sizeof(info), 0);
   
   //接收好友列表
    while (1)
    {
        if (  0 < read(TCP_fd , &info  , sizeof(info))   )
        {
            if (info.SYN  ==  2 )
            {
                text_center("好友列表\n",GREEN);
                for (size_t i = 0; i < strlen(info.data); i++)
                {
                    if (  info.data[i] ==' ' )
                    {
                        printf("\n");
                        continue;
                    }
                    else
                    {
                        printf("%c" ,  info.data[i]);
                    }
                    
                    
                }
            }
            else
            {
                ERRLOG("接收好友列表失败");
            }
           
            break;
        }
        
    }
    center_char("1、聊天\n" , GREEN);
    center_char("2、文件传输\n" , GREEN);
    center_char("3、返回\n" , GREEN);
    int flag=0;
    while (1)
    {
        scanf("%d" , &flag);
        switch (flag)
        {
        case 1:
            /**   开始监听   */
            if (0 != pthread_create(&tid, NULL, receive_read, (void *)&TCP_fd))
            {
                perror("pthread_create error:");
                close(TCP_fd);
                exit(-1);
            }
            pthread_detach(tid);

            /*
            选择好友
            */
            center_char("请选择聊天好友\n", GREEN);
            scanf("%s", info.dest_name);
            info.SYN = 3;
            strcpy(info.star_name, userinfo.name);
            center_char("可以开始聊天啦~\n", GREEN);
            while (1)
            {
                center_char("请输入你需要发送的信息\n", GREEN);
                scanf("%s", info.data);
                // center_char("2请输入你需要发送的信息\n" , GREEN);
              
                // center_char("3请输入你需要发送的信息\n" , GREEN);
                // printf("nfo.data = %s",info.data);
                if (-1 == send(TCP_fd, &info, sizeof(info), 0))
                {
                    ERRLOG("发送失败");
                }
                if (0 == strcmp(info.data, "退出"))
                {
                    return ;
                }
                // ERRLOG("发送成功");
            }
            break;
        case 2://文件传输

            break;
        case 3://   退出
            return ;
      
        default:
            break;
        }
    }

}

void personal_center(user_t userinfo )
{
    text_center("您的个人信息如下\n", RED);
    center_char("姓名：", RED);
    center_char(userinfo.name, RED);
    putchar('\n');
    center_char("账号：", RED);
    center_char(userinfo.account, RED);
     putchar('\n');
    center_char("密码：", RED);
    center_char(userinfo.passwd, RED);
     putchar('\n');
    center_char("手机号码：", RED);
    center_char(userinfo.phone, RED);
     putchar('\n');
    center_char("性别：", RED);
    center_char(userinfo.sex, RED);
     putchar('\n');
    center_char("等级：", RED);
    char temp[5];
    sprintf(temp ,"%d" ,userinfo.status);
    center_char(temp, RED);
    putchar('\n');
    center_char("退出请按任意按键\n", RED);
    char ch ;
    scanf(" %c" , &ch);
   
    
}



void dynamic_issue(void)
{



}


void group_chat_menu(user_t userinfo ,int  UDP_fd  ,struct sockaddr_in serveraddr )
{
    const wchar_t *menu_items[] = {L"创建群聊", L"加入群聊", L"退出群聊", L"退出"}; 
    
    const wchar_t *title = L"你孤独吗？这里有一群热情、团结的朋友等着你"; 
    int num_items = sizeof(menu_items) / sizeof(menu_items[0]);  
    int title_size=sizeof(title);
     int res;
     while (1)
     {
        res= Login_menu_1(0,menu_items,num_items,title,title_size);
        switch (res)
        {
        case 0://创建群聊
            printf("功能1\n");


            


             sleep(1.5);
            break;
        case 1://加入群聊
            printf("功能2\n");
            group_chat( userinfo ,UDP_fd , serveraddr);

            sleep(1.5);
            break;
        case 2://退出群聊
            printf("功能3\n");

            sleep(1.5);
            break;

        case 3://退出


      
            exit(-1);
        default:
            break;
        }
     }

}


char my_name[32];
// 发送消息的线程
void *write_pthread(void *sock)
{
    UDP_GROUP client_fd = *((UDP_GROUP *)sock);
    UDP_data client_data;
    memset(&client_data, 0, sizeof(client_data));

    // 初始化客户端名称并存入UDP_data的name字段
    printf("请输入你的名字: ");
    scanf("%s", client_data.name);
    strcpy(my_name , client_data.name);
    client_data.SYN =3;
    time_t current_time;
    time(&current_time);
    struct tm *local_time = localtime(&current_time);
    strftime(client_data.time, sizeof(client_data.time), "%m/%d %H:%M:%S", local_time);
    // 连接后立即发送客户端名称，通知服务器新客户端加入
    strcpy(client_data.data, "客户端加入");
 
    sendto(client_fd.UDP_fd, &client_data, sizeof(client_data), 0, (struct sockaddr *)&client_fd.serveraddr, sizeof(client_fd.serveraddr));

    while (1)
    {
        // 获取用户输入
        scanf("%s", client_data.data);
      
        // 显示自己的消息为绿色，并重置颜色
        printf("%s%s: %s%s\n", GREEN, client_data.name, client_data.data, RESET);

        // 发送消息给服务器
        if (-1 ==  sendto(client_fd.UDP_fd, &client_data, sizeof(client_data), 0,  (struct sockaddr *)&client_fd.serveraddr, sizeof(client_fd.serveraddr)))
        {
            printf("发送失败!\n");
        }
        


        if (strcmp(client_data.data, "quit") == 0)
        {
            printf("退出成功!\n");
            
            return NULL;
        
        }
    }
    return NULL;
}

// 接收消息的线程
void *read_pthread(void *sock)
{
    UDP_data recv_data;
    UDP_GROUP client_fd = *((UDP_GROUP *)sock);

    while (1)
    {
        memset(&recv_data, 0, sizeof(recv_data));
        recvfrom(client_fd.UDP_fd, &recv_data, sizeof(recv_data), 0,  NULL  ,NULL);

        // 如果收到的是自己发的消息，跳过显示
        if (strcmp(recv_data.name, my_name) != 0 && strcmp(recv_data.data, "客户端加入") != 0)
        {
            // 正确换行并显示其他客户端的消息，使用默认颜色
            printf("%s: %s\n", recv_data.name, recv_data.data);
        }

        if (strcmp(recv_data.data, "quit") == 0)
        {
            printf("服务器关闭连接\n");
            return NULL;
        }
    }
    return NULL;
}



void group_chat(user_t userinfo ,int  UDP_fd  ,struct sockaddr_in serveraddr)
{

// 选择需要加入的群聊
    pthread_t tid[2];
    UDP_GROUP udp_group;
    udp_group.UDP_fd=UDP_fd;
    udp_group.serveraddr=serveraddr;
    pthread_create(&tid[0], NULL, write_pthread, (void *)&udp_group);
    pthread_create(&tid[1], NULL, read_pthread, (void *)&udp_group);

    
    pthread_join(tid[0], NULL);
    pthread_join(tid[1], NULL);
    
// 选择下载文件还是聊天




}



























void friend_menu( user_t userinfo  , int TCP_fd)
{
    const wchar_t *menu_items[] = {L"添加好友", L"删除好友", L"好友聊天", L"好友查找", L"退出"}; 
    
    const wchar_t *title = L"你孤独吗？这里有一群热情、团结的朋友等着你"; 
    int num_items = sizeof(menu_items) / sizeof(menu_items[0]);  
    int title_size=sizeof(title);
     int res;
     while (1)
     {
        res= Login_menu_1(0,menu_items,num_items,title,title_size);
        switch (res)
        {
        case 0://添加好友
            printf("功能1\n");

            addfriend(userinfo , TCP_fd);
            


             sleep(1.5);
            break;
        case 1://删除好友
            printf("功能2\n");
            delfriend(userinfo , TCP_fd);

            sleep(1.5);
            break;
        case 2://好友聊天
            printf("功能3\n");
            friend_list(userinfo , TCP_fd);
      


            sleep(1.5);
            break;
        case 3://好友查找
            printf("功能4\n");
            findfriend(userinfo  , TCP_fd  );

            sleep(1.5);
            break;
        case 4://退出


      
        return ;
        default:
            break;
        }
     }
     
    
    

}



void addfriend(user_t userinfo  , int TCP_fd)
{
    TCP_data info; 
    info.SYN = 1;
    strcpy(info.star_name, userinfo.name);
    center_char("请输入您要添加的好友\n", YELLOW);
    scanf(" %s", info.dest_name);
    strcpy(info.data, "请求添加好友");
    if (-1 == send(TCP_fd, &info, sizeof(info), 0))
    {
        ERRLOG("发送失败");
        return;
    }
    printf("发送成功\n");
    memset(&info  , 0 , sizeof(info)  );
    while (1)
    {
        if (0 < read(TCP_fd, &info, sizeof(info)))
        {
            printf("%d\n%s\n%s\n%s\n" , info.SYN, info.star_name ,info.dest_name ,info.data);
            if (info.SYN == 1  && 0 == strcmp(info.data , "添加成功"))
            {
                center_char("添加成功\n",YELLOW);
            }
            else
            {
                ERRLOG("收到错误的信息");
            }

            break;
        }
    }
    return ;
}



void delfriend(user_t userinfo  , int TCP_fd)
{
    TCP_data info; 
    info.SYN = 5;
    strcpy(info.star_name, userinfo.name);
    center_char("请输入您要删除的好友\n", YELLOW);
    scanf(" %s", info.dest_name);
    strcpy(info.data, "请求删除好友");
    if (-1 == send(TCP_fd, &info, sizeof(info), 0))
    {
        ERRLOG("发送失败");
        return;
    }
    printf("发送成功\n");
    memset(&info  , 0 , sizeof(info)  );
    while (1)
    {
        if (0 < read(TCP_fd, &info, sizeof(info)))
        {
            if (info.SYN == 5  && 0 == strcmp(info.data , "删除成功"))
            {
                center_char("删除成功\n",YELLOW);
            }
            else
            {
                ERRLOG("收到错误的信息");
            }

            break;
        }
    }
    return ;
}



void findfriend( user_t userinfo ,int TCP_fd)
{
 TCP_data info; 
    info.SYN = 6;
    strcpy(info.star_name, userinfo.name);
    center_char("请输入您要查找的好友\n", YELLOW);
    scanf(" %s", info.dest_name);
    strcpy(info.data, "请求查找好友");
    if (-1 == send(TCP_fd, &info, sizeof(info), 0))
    {
        ERRLOG("发送失败");
        return;
    }
    printf("发送成功\n");
    memset(&info  , 0 , sizeof(info)  );

    while (1)
    {
        if (0 < read(TCP_fd, &info, sizeof(info)))
        {
            if (info.SYN == 6  && 0 == strcmp(info.data , "查找成功"))
            {
                center_char("查找成功\n",YELLOW);
                center_char( info.data   ,YELLOW);

            }
            else
            {
                ERRLOG("收到错误的信息");
            }

            break;
        }
    }
    return ;
}